#include <WiFi.h>          // 引入WiFi库，用于连接WiFi网络
#include <WebServer.h>     // 引入WebServer库，用于创建HTTP服务器
#include <LittleFS.h>      // 引入LittleFS库，用于文件系统操作
#include <U8g2lib.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>

#define SCL_1   4
#define SDA_1   5
#define DIR_1   7          // 定义方向控制引脚为7
#define PUL_1   6          // 定义脉冲控制引脚为6

#include "StepMotor.h"     // 引入自定义的步进电机控制库

String ssid;
String password;

WebServer server(80);             // 创建WebServer对象，监听80端口
StepMotor motor_0(/* pul=*/ PUL_1, /* dir=*/ DIR_1, /* channel=*/ 0); // 初始化步进电机对象
bool lightState = false;          // 灯的状态，初始为关闭
bool motorRunning = false;        // 电机的运行状态，初始为停止
float motorSpeed = 0;             // 电机的速度，初始为0

// 处理根路径请求
void handleRoot() {
  if (LittleFS.exists("/index.html")) {  // 检查文件系统中是否存在index.html文件
    File file = LittleFS.open("/index.html", "r"); // 打开文件
    server.streamFile(file, "text/html");         // 将文件内容作为HTTP响应发送
    file.close();                                 // 关闭文件
  } else {
    server.send(404, "text/plain", "File not found"); // 如果文件不存在，返回404错误
  }
}

// 处理踏板配置请求
void handlePedalConfig() {
  if (LittleFS.exists("/pedal_control.html")) {
    File file = LittleFS.open("/pedal_control.html", "r");
    server.streamFile(file, "text/html");
    file.close();
  } else {
    server.send(404, "text/plain", "File not found");
  }
}

// 处理WiFi配置请求
void handleWiFiConfig() {
  if (LittleFS.exists("/wifi_config.html")) {
    File file = LittleFS.open("/wifi_config.html", "r");
    server.streamFile(file, "text/html");
    file.close();
  } else {
    server.send(404, "text/plain", "File not found");
  }
}

// 处理连接WiFi请求
void handleConnectWiFi() {
  if (server.hasArg("ssid") && server.hasArg("password")) {
    String newSSID = server.arg("ssid");
    String newPassword = server.arg("password");
    WiFi.begin(newSSID.c_str(), newPassword.c_str());
    unsigned long startAttemptTime = millis(); // 记录开始尝试连接的时间
    while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < 2000) { // 等待WiFi连接成功或超时
      server.send(200, "text/plain", "正在连接到WiFi...");
    }
    

    // 更新wifi.txt文件
    File wifiFile = LittleFS.open("/wifi.txt", "w");
    wifiFile.println(newSSID);
    wifiFile.println(newPassword);
    wifiFile.close();

    // 重启设备
    ESP.restart();
  } else {
    server.send(400, "text/plain", "缺少SSID或密码");
  }
}

// 处理设置速度请求
void handleSetSpeed() {
  if (server.hasArg("value")) {  // 检查请求中是否包含"value"参数
    motorSpeed = server.arg("value").toFloat(); // 获取速度值并转换为浮点数
    if (motorRunning) {
      motor_0.motorSpeed(-motorSpeed); // 如果电机正在运行，更新电机速度
    }
    server.send(200, "text/plain", "速度已设置为 " + String(motorSpeed)); // 返回成功响应
  } else {
    server.send(400, "text/plain", "缺少速度值"); // 如果缺少参数，返回400错误
  }
}

// 处理启动电机请求
void handleStart() {
  motorRunning = true;           // 设置电机状态为运行
  motor_0.motorSpeed(-motorSpeed); // 启动电机，设置速度为当前速度
  server.send(200, "text/plain", "电机已运行"); // 返回成功响应
}

// 处理停止电机请求
void handleStop() {
  motorRunning = false;          // 设置电机状态为停止
  motor_0.motorSpeed(0);         // 停止电机，速度为0
  server.send(200, "text/plain", "电机已停止"); // 返回成功响应
}

// 处理切换灯状态请求
void handleToggleLight() {
  lightState = !lightState;      // 切换灯的状态
  digitalWrite(13, lightState ? HIGH : LOW); // 根据状态设置引脚电平
  server.send(200, "text/plain", lightState ? "灯已打开" : "灯已关闭"); // 返回成功响应
}

// 处理踏板踩下请求
void handlePress() {
  motor_0.motorSpeed(-10000); // 设置电机速度
  delay(5500);               // 延时5.5秒
  motor_0.motorSpeed(0);     // 停止电机
  server.send(200, "text/plain", "踏板已踩下"); // 返回成功响应
}

// 处理踏板抬起请求
void handleRelease() {
  motor_0.motorSpeed(10000); // 设置电机速度
  delay(5500);               // 延时5.5秒
  motor_0.motorSpeed(0);     // 停止电机
  server.send(200, "text/plain", "踏板已抬起"); // 返回成功响应
}

// 初始化LED
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE, /* clock=*/SCL_1, /* data=*/SDA_1);
void screen()
{
    // 清除缓存区内容
    u8g2.clearBuffer();
    // 绘制内容
    u8g2.setFont(u8g2_font_ncenB08_tr);
    u8g2.setCursor(10, 15);
    if (WiFi.status() == WL_CONNECTED) {
        u8g2.println("WiFi connected");
        u8g2.setCursor(10, 30);
        u8g2.print("SSID: ");
        u8g2.println(WiFi.SSID());
        u8g2.setCursor(10, 45);
        u8g2.print("IP: ");
        u8g2.println(WiFi.localIP());
    } else {
        u8g2.println("WiFi not connected");
    }
    u8g2.sendBuffer();
}

// 初始化设置
void setup() {
  // 初始化 OLED 对象
  u8g2.begin();
  // 开启中文字符支撑
  u8g2.enableUTF8Print();
  // 设置字体
  u8g2.setFont(u8g2_font_ncenB08_tr);

  Serial.begin(115200);          // 初始化串口通信，波特率为115200
  pinMode(13, OUTPUT);           // 设置引脚13为输出模式（控制灯）
  digitalWrite(13, LOW);         // 初始化灯为关闭状态
  pinMode(12, OUTPUT);          
  digitalWrite(12, LOW);         

  if (!LittleFS.begin()) {       // 初始化LittleFS文件系统
    Serial.println("LittleFS mount failed"); // 如果初始化失败，打印错误信息
    return;
  }

  // 读取WiFi名称和密码
  if (LittleFS.exists("/wifi.txt")) {
    File wifiFile = LittleFS.open("/wifi.txt", "r");
    ssid = wifiFile.readStringUntil('\n');
    password = wifiFile.readStringUntil('\n');
    ssid.trim();
    password.trim();
    wifiFile.close();
  } else {
    Serial.println("wifi.txt文件不存在");
    return;
  }

  WiFi.begin(ssid.c_str(), password.c_str());    // 连接WiFi网络
  unsigned long startAttemptTime = millis(); // 记录开始尝试连接的时间

  while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < 2000) { // 等待WiFi连接成功或超时
    Serial.println("正在连接WiFi...");
  }

  if (WiFi.status() != WL_CONNECTED) { // 如果未连接成功
    Serial.println("WiFi连接失败，启动热点");
    WiFi.softAP("ESP32_Hotspot");
    Serial.println("热点已打开");
    // server.on("/", handleRoot);
    // server.on("/wifi", handleWiFiConfig);
    // server.on("/connect", HTTP_POST, handleConnectWiFi);
  } else {
    Serial.println("WiFi连接成功"); // 打印WiFi连接成功信息
    WiFi.softAPdisconnect(true);
    Serial.println("热点已关闭");
  }
    // 设置HTTP请求处理函数
    // server.on("/", handleRoot);           // 根路径请求
    server.on("/control", handleRoot);           // 根路径请求
    server.on("/wifi", handleWiFiConfig); // WiFi配置请求
    server.on("/", handlePedalConfig);   // 踏板配置请求
    // server.on("/pedal", handlePedalConfig);   // 踏板配置请求
    server.on("/connect", HTTP_POST, handleConnectWiFi);  // 连接WiFi请求
    server.on("/setSpeed", handleSetSpeed); // 设置速度请求
    server.on("/start", handleStart);     // 启动电机请求
    server.on("/stop", handleStop);       // 停止电机请求
    server.on("/toggleLight", handleToggleLight); // 切换灯状态请求
    server.on("/pressPedal", handlePress);     // 踏板踩下请求
    server.on("/releasePedal", handleRelease); // 踏板抬起请求
  server.begin(); // 启动Web服务器
}

// 主循环
void loop() {
  server.handleClient(); // 处理客户端请求
  screen();
  
}